//
//  HMUserInfoViewModel.swift
//  01-SinaWeibo
//
//  Created by 周英培 on 16/5/23.
//  Copyright © 2016年 周英培. All rights reserved.
//

import UIKit

/*
 /.封装网络请求
 2.数据存储
 3.对外提供本地缓存的用户数据
 */

import SVProgressHUD

private let userInfoKey = "com.baidu.userInfoKey"

class HMUserInfoViewModel: NSObject {

    //设置单例
    static let sharedUserInfoViewModel : HMUserInfoViewModel = HMUserInfoViewModel()
    
    //定义成全局属性
    var userInfoModel : HMUserInfoModel?
    
    //重写构造函数，加载用户的账户模型
   private override init() {
        super.init()
    
    //模型赋值
    userInfoModel = loadUserInfo()
    }
    
    //通过一判断用户是否登录的计算型属性 来解决 每次都需要判断的问题
    //计算型属性 每次调用都会执行
    var userLogin: Bool {
        
        if userInfoModel?.expires_date?.compare(NSDate()) == .OrderedDescending {
            return true
        }
        
        //如果过期  需要将 userAccount 设置为 nil
        userInfoModel = nil
        return false
    }
    
    //增加一个用户头像地址 纯种NSURL地址
    //只读属性 特点:每次执行都会进行计算
    var headURL : NSURL? {
    
        get {
        
            return NSURL(string : userInfoModel?.avatar_large ?? "")
        
        }
    
    }
    
    
    
}

extension HMUserInfoViewModel {

    //根据获取的授权码去获取token （令牌
    func loadToken(code:String,finished : (isSuccess:Bool) -> ()) {
        
        HMNetworkTools.sharedTools.loadToken(code) { (responseObject, error) in
            
            //根据获取的token 去获取用户的信息
            if error != nil {//判读有错误的情况下
                
                SVProgressHUD.showErrorWithStatus("没有网络")
                finished(isSuccess: false)
                
                return
                
            }
            
            //请求成功，获取用户信息
            self.loadUserInfo(responseObject,finished: finished)
        }
        
//        let urlString = "https://api.weibo.com/oauth2/access_token"
//        
//        let parameters = ["client_id":client_id,"client_secret":client_secret,"grant_type":"authorization_code","code":code,"redirect_uri":redirect_uri]
//        
//        
//        HMNetworkTools.sharedTools.request(.POST, urlString: urlString, parameters: parameters) { (responseObject, error) in
//            print(responseObject,error)
//            
//            //根据获取的token 去获取用户的信息
//            if error != nil {//判读有错误的情况下
//                
//                SVProgressHUD.showErrorWithStatus("没有网络")
//                finished(isSuccess: false)
//                
//                return
//                
//            }
//            
//            //请求成功，获取用户信息
//            self.loadUserInfo(responseObject,finished: finished)
//            
//        }
//        
    }
    
    //获取用户信息
    func loadUserInfo(response:AnyObject?,finished : (isSeccess : Bool) -> ()) {
        
        guard let result = response as? [String : AnyObject] else {//判断如果字典解析不出来，就是错误的
            
            SVProgressHUD.showErrorWithStatus("获取信息错误")
            
            finished(isSeccess: false)
            
            return
            
        }
        
        HMNetworkTools.sharedTools.loadUserInfo(result) { (responseObject, error) in
            if error != nil {
                
                SVProgressHUD.showErrorWithStatus("有错误")
                
                finished(isSeccess: false)
                
                return
                
            }
            
            //获取用户信息之后，将两个字典的数据合并在一起  用偏好设置保存到内地
            guard var dict = responseObject as? [String : AnyObject] else {
                
                SVProgressHUD.showErrorWithStatus("字典错误")
                
                finished(isSeccess: false)
                
                return
                
            }
            
            //            print(responseObject)
            
            //便利字典 保存数据
            for (key,value) in result {
                
                dict[key] = value
                
            }
            
            self.saveUserInfo(dict)
            
            //完成成功的回调
            finished(isSeccess: true)
        }
        
//        let urlString = "https://api.weibo.com/2/users/show.json"
//        
//        //字典里面不能为nil
//        
//        let access_token = result["access_token"]!
//        
//        let uid = result["uid"]!
//        
//        let parameters = ["access_token":access_token,"uid":uid]
//        
//        HMNetworkTools.sharedTools.request(.GET, urlString: urlString, parameters: parameters) { (responseObject, error) in
//            
//            if error != nil {
//                
//                SVProgressHUD.showErrorWithStatus("有错误")
//                
//                finished(isSeccess: false)
//                
//                return
//                
//            }
//            
//            //获取用户信息之后，将两个字典的数据合并在一起  用偏好设置保存到内地
//            guard var dict = responseObject as? [String : AnyObject] else {
//                
//                SVProgressHUD.showErrorWithStatus("字典错误")
//                
//                finished(isSeccess: false)
//                
//                return
//                
//            }
//            
//            //            print(responseObject)
//            
//            //便利字典 保存数据
//            for (key,value) in result {
//                
//                dict[key] = value
//                
//            }
//            
//            self.saveUserInfo(dict)
//            
//            //完成成功的回调
//            finished(isSeccess: true)
//            //dict转成模型对象
//            let user = HMUserInfoModel(dict: dict)
//            
//            //将模型对象转换成字典
//            let keys = ["access_token","expires_in","uid","avatar_large","name"];
//            let userInfo = user.dictionaryWithValuesForKeys(keys)
//            
//            //使用偏好设置保存数据
//            let userDefalults = NSUserDefaults.standardUserDefaults()
//            
//            //不能向偏好设置里面储存nil
//            userDefalults.setObject(userInfo, forKey: userInfoKey)
//            
//            //同步
//            userDefalults.synchronize()
        }
        
        
    }




//存取数据
extension HMUserInfoViewModel {

    //存储数据
    func saveUserInfo(dict : [String : AnyObject]) {
    
        //dict转成模型对象
        let user = HMUserInfoModel(dict: dict)
        
        //赋值 解决从未登录到登录 获取不到值的问题
        self.userInfoModel = user
        
        //将模型对象转换成字典
        let keys = ["access_token","expires_in","uid","avatar_large","name"];
        let userInfo = user.dictionaryWithValuesForKeys(keys)
        
        //使用偏好设置保存数据
        let userDefalults = NSUserDefaults.standardUserDefaults()
        
        //不能向偏好设置里面储存nil
        userDefalults.setObject(userInfo, forKey: userInfoKey)
        
        //同步
        userDefalults.synchronize()
    
    }
    
    //读取数据
    //将数据转换成模型 方便后面传递数据用
    func loadUserInfo() -> HMUserInfoModel? {
    
        //判断是否是字典
        //如果使用 as! 强制解包  在偏好设置并没有保存数据的时候 程序会崩溃 因为第一次登录时 是没有保存数据的
        //会多次调用磁盘数据，对磁盘是种伤害，并且性能不高 ，最好设置成单例
        guard let dict = NSUserDefaults.standardUserDefaults().objectForKey(userInfoKey) as? [String : AnyObject] else {
        
        return nil
            
        }
    
        let user = HMUserInfoModel(dict: dict)
        
        return user
        
    }
    

}
